import tkinter
import time
import random
class Ball():
    # 初始化  功能   参数 属性   球的大小 颜色 球移动  放到画布
    def __init__(self, canvas,paddle,score,color):
        self.canvas = canvas   # 外部画布 传到 Ball类 局部变量  保证 小球 跟画布在一个屏幕
        self.paddle = paddle
        self.score = score
        # 创建一个椭圆 self.id
        self.id = canvas.create_oval(0,0,35,35, fill = color)
        # 小球的初始位置 放在 395,250
        canvas.move(self.id,395,250)
        level = [-7,-5,-3,-1,1,3,5,7]
        self.x = random.choice(level)
        self.y = random.choice(level)
        self.hit_bottom=False
    def draw(self):
        self.canvas.move(self.id, self.x, self.y) # x 水平移动  y 垂直移动速度
        pos = self.canvas.coords(self.id)   # 获取小球的坐标
        # pos = [x1,y1,x2,y2]
        if pos[3] >= 600: #  小球碰到底部 往上
            self.hit_bottom=True
        if pos[1] <= 0:    # 小球最顶部y1  不断往上 减小 到最顶部 0
            self.y = 3     # 设置y 为正数 往下弹
        if pos[0] <= 0:   # 当小球的最左边 x1 不断往左 减小 到最左边 0
            self.x = 3   #  设置 x 为正数 往右弹
        if pos[2] >= 800:
            self.x = -3
        if self.hit_paddle(pos)==True:
            self.y=-3
    def hit_paddle(self,pos):
        paddle_pos = self.canvas.coords(self.paddle.id)
        if pos[2]>=paddle_pos[0] and pos[0]<=paddle_pos[2]:
            if paddle_pos[3]>=pos[3] and pos[3]>=paddle_pos[1]:
                self.x=self.x+self.paddle.x
                self.score.hit()
                return True
        return False

  
class Paddle():
    # 初始化  功能   参数 属性   球的大小 颜色 球移动  放到画布
    def __init__(self, canvas, color):
        self.canvas = canvas   # 外部画布 传到 Ball类 局部变量  保证 小球 跟画布在一个屏幕
        # 创建一个长方形 矩形 球拍 self.id
        self.id = canvas.create_rectangle(0,0,250,20, fill = color)
        canvas.move(self.id, 200, 450)
        self.x = 0
        self.y = 0
        # 监听球拍  方向键盘 一旦按下方向 向左按钮 让 球拍向左移
        self.canvas.bind_all('<KeyPress-Left>',self.turn_left)
        # 监听全部 方向左键 按下，则执行后面的函数
        self.canvas.bind_all('<KeyPress-Right>',self.turn_right)
        self.canvas.bind_all('<Button-1>',self.game_start)
        self.start=False
    def game_start(self,evt):
        self.start=True


       
    def draw(self):
        self.canvas.move(self.id, self.x, self.y) # x 水平移动  y 垂直移动速度
        pos = self.canvas.coords(self.id)   # 获取球拍的坐标
        if pos[0] <= 0:   # 当小球的最左边 x1 不断往左 减小 到最左边 0
            self.x = 3   #  设置 x 为正数 往右弹
        if pos[2] >= 800:
            self.x = -3
        if pos[3] >= 600:   # 小球最底部 y2 不断往下 到最底部 400
            self.y = -3    # 设置 y 往上弹 负数
        if pos[1] <= 0:    # 小球最顶部y1  不断往上 减小 到最顶部 0
            self.y = 3     # 设置y 为正数 往下弹
    def turn_left(self,evt):  # 自定义turn_left函数，
        self.x = -3
    def turn_right(self,evt):
        self.x = 3

class Score():   # 自定义的分数
    def __init__(self, canvas, color):
        self.canvas = canvas   # 外部画布 传到 Ball类 局部变量  保证 小球 跟画布在一个屏幕
        self.score = 0
        # 创建一个文本  初始位置 450,20，text =
        self.id = canvas.create_text(750,30, text = self.score, font =("Arial",30), fill = color)
        #canvas.move(self.id, 0, 0)   # 文字初始化放在屏幕的位置
    def hit(self):
        self.score = self.score+1
        self.canvas.itemconfig(self.id,text=self.score)

tk = tkinter.Tk()   #  把动画模块实例化出来  tk 窗口动画
tk.title("第一个自己学的小游戏")
tk.resizable(0,0)
tk.wm_attributes('-topmost',1)   # 窗口置前
# 创建一个画布 宽为500 高为400  实例化 画布
canvas = tkinter.Canvas(tk,width=800, height= 600)
# 画布打包 看的见
canvas.pack()
tk.update()

game_over_text = canvas.create_text(400, 300, text="小辣鸡，真菜啊", font=("Arial", 30), state='hidden')
score = Score(canvas,"red")
paddle =  Paddle(canvas, "blue")
ball = Ball(canvas, paddle,score,"red")

# 实例化球拍
#  挂掉 复活 自定义函数 复活
#  球拍击打到小球  分数变化 小球方向变化  向上弹
#  游戏的开关    开始键 任意开始   游戏结束 小球碰到底部 游戏结束
#  提交到gitee
# while 1 不断执行 无限循环
while 1:
    if ball.hit_bottom==False and paddle.start==True:
        ball.draw()  # 让球移动
        paddle.draw()  # 让球拍移动
        if ball.hit_bottom==True:
            canvas.itemconfig(game_over_text, state='normal')
    tk.update_idletasks()
    tk.update()
    time.sleep(0.01)
